#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Data_type int
#define MAX 10
// 定义顺序队列结构体
typedef struct queue
{
    Data_type data[MAX];
    int front; // 对头
    int rear;  // 队尾
} sequeue;

// 创建顺序队列
sequeue *create_queue()
{
    sequeue *q = (sequeue *)malloc(sizeof(sequeue));
    q->front = q->rear = 0;
    memset(q, 0, sizeof(Data_type) * MAX);
    return q;
}
// 判满 1满了，0没满，-1队列为NULL
int is_full(sequeue *L)
{
    if (L == NULL)
    {
        return -1;
    }
    if (L->rear - L->front == MAX - 1)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
// 入队
int queue_push(sequeue *L, Data_type value)
{
    if (L == NULL)
    {
        return -1;
    }
    // 判断是否满了
    if (is_full(L))
    {
        printf("满了\n");
        return -1;
    }
    L->data[L->rear % MAX] = value;
    L->rear++;
}
// 判空 1空了，0没空，-1队列为NULL
int is_empty(sequeue *L)
{
    if (L == NULL)
    {
        return -1;
    }
    if (L->front == L->rear)
    {
        return 1;
    }
    return 0;
}
// 出队
Data_type queue_pop(sequeue *L)
{
    if (L == NULL)
    {
        return -1;
    }
    if (is_empty(L))
    {
        return -1;
    }
    Data_type value = L->data[L->front % MAX];
    L->front++;
    return value;
}
int queue_length(sequeue *L)
{
    if (L == NULL)
    {
        return -1;
    }
    if (is_empty(L))
    {
        return -1;
    }
    return L->rear - L->front;
}
// 获取头元素
Data_type queue_head(sequeue *L)
{
    if (L == NULL)
    {
        return -1;
    }
    if (is_empty(L))
    {
        return -1;
    }
    return L->data[L->front % MAX];
}
// 获取尾元素
int queue_tail(sequeue *L)
{

    if (L == NULL)
    {
        return -1;
    }
    if (is_empty(L))
    {
        return -1;
    }
    return L->data[L->rear - 1 % MAX];
}
// 打印
void queue_printf(sequeue *L)
{
    if (L == NULL)
    {
        return;
    }
    for (int i = L->front; i < L->rear; i++)
    {
        printf("%d----%d\t", i, L->data[i]);
    }
    printf("\n");
}
// 销毁
int queue_destory(sequeue *L)
{
    if (L == NULL)
    {
        printf("队列为空/n");
        return -1;
    }
    printf("销毁不生效\n");
    free(L);
    for (int i = 0; i < MAX; i++)
    {
        L->data[i] = 0;
    }
    L = NULL;
    return 0;
}
// 查找
Data_type queue_get(sequeue *L, int pos)
{
    if (L == NULL)
    {
        printf("队列为空/n");
        return -1;
    }
    return L->data[pos];
}
int queue_set(sequeue *L, int pos, Data_type value)
{
    if (L == NULL)
    {
        printf("队列为空/n");
        return -1;
    }
    L->data[pos] = value;
}

void main()
{
    sequeue *q = create_queue();
    queue_push(q, 1);
    queue_push(q, 2);
    queue_push(q, 13);
    queue_push(q, 20);
    queue_push(q, 26);
    // for (int i = q->front; i < q->rear; i++)
    // {
    //     printf("出队数据：%d\n", queue_pop(q));
    // }
    printf("\n");
    printf("头元素：%d\n", queue_head(q));
    printf("尾元素：%d\n", queue_tail(q));
    printf("元素长度：%d\n", queue_length(q));
    // queue_printf(q);
    // queue_destory(q);
    printf("查找%d个：%d", 3, queue_get(q, 3));
    queue_set(q, 2,998);
    printf("\n");
    queue_printf(q);
}